ElastiCache for MemcachedをLaravelに設定してみた!
こんにちは、コンサル部@大阪オフィスのTodaです。
ここ最近AWS資格を勉強するために色々なAWSサービスを試しています。
今回はAmazon ElastiCache Memcachedを作成してLaravelのセッション保存先に利用してみたいと思います。
構成イメージ
プライベートサブネットに新規ElastiCache(Memcached)を作成してEC2インスタンス内のLaravelで利用できる状態にします。
やりたいこと
- ElastiCache( Memcached )の新規作成をする。
- Laravelのセッション保存先として利用する。
前提条件
- EC2インスタンスにはLaravel バージョン6が動作可能の状態から始めます。
- VPCの構成はVPC,サブネットが準備されている状態から始めます。
実際やってみる
ElastiCache用のセキュリティグループ作成
ElastiCacheへのアクセス制限するためセキュリティグループを作成します。
Memcachedを使うためTCP 11211を許可するように設定します。
接続可能な範囲はEC2(Laravel)が関連付けされているセキュリティグループを指定します。
パラメータグループの設定作成
ElastiCacheに設定する内容をまとめたパラメータグループを作成します。
初めからデフォルト設定が用意されていますが、独自の設定を試す場合は新規作成いたします。
今回は Memcached1.6 を指定します。
サブネットグループの作成
ElastiCacheは指定されたサブネット内に構築されるようになっています。
サブネットグループは複数のサブネットを事前に指定します。
今回はプライベートサブネット2点を設定します。
ElastiCacheの作成
ElastiCacheの画面から作成をクリックします。
ElastiCacheにはクラスターエンジンとして Memcached と Redis が選択できます。
今回は Memcached を指定します。
Memcachedの設定ではエンジンバージョンを1.6.6を指定します。
パラメータは作成した設定を利用し、ノードのタイプはcache.t2.microを選択します。
Memcachedの詳細設定にはサブネットグループとセキュリティグループがございます。
事前に作成した設定を選択します。
設定が終わりましたら作成をクリックする事でElastiCacheが作成されます。
ステータスがavailableになると利用が可能になります。
Laravelで利用する場合、設定エンドポイントの内容が必要になりますのでメモをします。
以降の作業はLaravelが導入されているインスタンス内の作業になります。
PHPモジュールの追加
Laravelには標準でMemcachedに関する設定項目が準備されています。
私の環境の場合、モジュール不足のエラーが表示されたため対象のPHP拡張モジュールを追加導入いたします。
sudo yum install php-pecl-memcached
Laravelの変更内容を確認
Laravelのconfig/cache.phpの内容を確認したところ下記環境変数を変更することで対応できることがわかりました。
CACHE_DRIVER:memcachedに変更
MEMCACHED_HOST:ElastiCacheの設定エンドポイントを指定
return [ /* |-------------------------------------------------------------------------- | Default Cache Store |-------------------------------------------------------------------------- | | This option controls the default cache connection that gets used while | using this caching library. This connection is used when another is | not explicitly specified when executing a given caching function. | | Supported: "apc", "array", "database", "file", | "memcached", "redis", "dynamodb" | */ 'default' => env('CACHE_DRIVER', 'file'), 'stores' => [ 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), ], 'memcached' => [ 'driver' => 'memcached', 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 'sasl' => [ env('MEMCACHED_USERNAME'), env('MEMCACHED_PASSWORD'), ], 'options' => [ // Memcached::OPT_CONNECT_TIMEOUT => 2000, ], 'servers' => [ [ 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 'port' => env('MEMCACHED_PORT', 11211), 'weight' => 100, ], ], ],
Laravelの設定変更
Laravelディレクトリ直下にある.envファイル開き、環境変数を変更します。
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:XXXXXXXXXXXXXXXXXXX APP_DEBUG=true APP_URL=http://localhost # 下記変更 SESSION_DRIVER=memcached MEMCACHED_HOST=XXXXXXXXXXXXXXXXXXXX.cache.amazonaws.com MEMCACHED_PORT=11211
変更後の確認
Laravelには簡易にログインフォームを作成する機能がございます。
アカウントを作成してログインをおこない、セッションに保存する処理でElastiCacheが利用されていることを確認します。
セッションの保存内容を確認
ElastiCache Memcachedは内容を簡易に確認する機能がございません。
telnetやmemcached-toolを利用して内容を確認いたします。
memcached-toolはmemcachedをyumでインストールすると付属するツールになります。
memcached-toolのdump機能を利用して内容を出力してみます。
memcached-tool XXXXXXXXXXXXXXXXXXXX.cache.amazonaws.com:11211 dump Dumping memcache contents Number of buckets: 1 Number of items : 1 Dumping bucket 1 - 1 total items add laravel_cache:XXXXXXXXXXXXXXXXXXX 0 1606318847 246 a:4:{s:6:"_token";s:40:"XXXXXXXXXXXXXXXXXXX";s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}s:9:"_previous";a:1:{s:3:"url";s:26:"http://XX.XX.XX.XX/home";}s:50:"login_web_xxxxxxxxxxxxx";i:1;}
セッションが保存されている事を確認いたしました。
さいごに
ElastiCache MemcachedをLaravelで利用してみました。
ElastiCache Memcachedにセッションを保存する事で「ステートレス化」に少し近づいた状態になります。
最終は複数インスタンス構成で信頼性の高い構成ができればと考えております。